package org.tinygroup.bizframe.common.security;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.tinygroup.logger.Logger;
import org.tinygroup.logger.LoggerFactory;
/**  
 * 对密码进行加密和验证的类 
 */  
public class MD5Util{
	
	private static final Logger logger = LoggerFactory.getLogger(MD5Util.class);
	 // 全局数组
    private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    // 返回形式为数字跟字符串
    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        // System.out.println("iRet="+iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return strDigits[iD1] + strDigits[iD2];
    }

    // 返回形式只为数字
    private static String byteToNum(byte bByte) {
        int iRet = bByte;
        if (iRet < 0) {
            iRet += 256;
        }
        return String.valueOf(iRet);
    }

    // 转换字节数组为16进制字串
    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }

    /**
     * 在安全性要求较高的系统中，不应使用被业界公认的不安全的哈希算法（如MD2、MD4、MD5、SHA、SHA1等)来保证数据的完整性。
     * 在安全性要求较高的系统中，应采用散列值>=224比特的SHA系列算法（如SHA-224、SHA-256、SHA-384和SHA-512）来保证敏感数据的完整性。
     * @param strObj
     * @return
     */
    public static String GetMD5Code(String strObj) {
        String resultString = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(strObj.getBytes());
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest());
        } catch (NoSuchAlgorithmException ex) {
//          ex.printStackTrace();
        	logger.error(ex);
        }
        return resultString;
    }
}  
